var arr = ['a', 'b', 'c', 'd'];

for (let a in arr) { // for...in循环读取键名
    console.log(a); // 0 1 2 3
}

for (let a of arr) { //for...of循环读取键值
    console.log(a); // a b c d
}


let arrayLike = {
    '0' : 'a',
    '1' : 'b',
    '2' : 'c',
    length: 3
};

var arr1 = [].slice.call(arrayLike); // ES5
let arr2 = Array.from(arrayLike); // ES6

console.log(arr1);  // [ 'a', 'b', 'c' ]
console.log(arr2);

console.log(Array.from([1,2,3]).map(x => x * x)); // [1,4,9]
console.log(Array.from({length: 2}, () => 'jack')); // ['jack', 'jack']

//copyWithin(target, start=0, end=this.length)
//用 [start,end) 的值替换从 target 开始的值
console.log([1,2,3,4,5].copyWithin(0,3)); // [ 4, 5, 3, 4, 5 ]


// Array.of() 可以代替 Array()，
// Array()的语义不明确, Array方法没有参数、一个参数、三个参数时，返回结果都不一样。
// 只有当参数个数不少于2个时，Array()才会返回由参数组成的新数组
Array.of(3, 11, 8); // [3,11,8]
Array.of(3);// [3]
Array.of(3).length; // 1

Array(); // []
Array(3); // [, , ,]
Array(3, 11, 8); // [3, 11, 8]

console.log([1, 4, -5, 10].find((n) => n < 0));  // -5
console.log([1, 5, 10, 15].findIndex(function(value, index, arr) {
    return value > 9;
}));  // 2

console.log(['a', 'b', 'c'].fill(7));  //[7, 7, 7]
console.log(['a', 'b', 'c'].fill(7, 1, 2)); //['a', 7, 'c']

for (let index of ['a', 'b'].keys()) {
    console.log(index);
}
// 0
// 1

/*for (let elem of ['a', 'b'].values()) {
    console.log(elem);
}*/
// 'a'
// 'b'

for (let [index, elem] of ['a', 'b'].entries()) {
    console.log(index, elem);
}
// 0 "a"
// 1 "b"

//includes() 方法的第二个参数为可选参数，表示搜索的起始位置，默认为0。如果第二个参数为负数，则表示倒数的位置
console.log([1, 2, 3].includes(2, 0)); // true

//forEach(), filter(), every() 和some()都会跳过空位。
// map()会跳过空位，但会保留这个值
// join()和toString()会将空位视为undefined，而undefined和null会被处理成空字符串。
console.log("空位的处理:");
// forEach方法
console.log("forEach:", [,'a'].forEach((x,i) => console.log(i))); // 1, undefined

// filter方法
console.log("filter: ", ['a',,'b'].filter(x => true)); // ['a','b']

// every方法
console.log([,'a'].every(x => x==='a')); // true

// some方法
console.log([,'a'].some(x => x !== 'a')); // false

// map方法
console.log([,'a'].map(x => 1)); // [,1]

// join方法
console.log([,'a',undefined,null].join('#')); // "#a##"

// toString方法
console.log([,'a',undefined,null].toString()); // ",a,,"


// 数组合并
console.log("数组合并");
var arr1 = ['a', 'b'];
var arr2 = ['c'];
var arr3 = ['d', 'e'];

// ES5的合并数组
console.log(arr1.concat(arr2, arr3)); // [ 'a', 'b', 'c', 'd', 'e' ]

// ES6的合并数组
console.log([...arr1, ...arr2, ...arr3]); // [ 'a', 'b', 'c', 'd', 'e' ]

console.log("数组解构");
const [first, ...rest] = [1, 2, 3, 4, 5];
console.log(first); // 1
console.log(rest);  // [2, 3, 4, 5]

const [first, ...rest] = [];
console.log(first); // undefined
console.log(rest);  // []:

const [first, ...rest] = ["foo"];
console.log(first);  // "foo"
console.log(rest);   // []
